package 多线程; // 定义包名

public class waitSleep { // 定义类，用于演示wait和sleep方法
    
    static final Object lock = new Object(); // 定义一个静态对象作为锁

    private static void waiting() throws InterruptedException{ // 方法用于演示wait方法
        Thread t1 = new Thread(() -> { // 创建线程t1
            synchronized(lock){ // 同步块，使用lock对象作为锁
                try {
                    System.out.println(Thread.currentThread().getName() + "...waiting..."); // 输出线程等待信息
                    lock.wait(5000L); // 线程等待5秒
                    System.out.println(Thread.currentThread().getName() + "...running...end..."); // 输出线程结束信息
                } catch (InterruptedException e) { // 捕获中断异常
                    System.out.println(Thread.currentThread().getName() + "...interrupted..."); // 输出线程中断信息
                    e.printStackTrace(); // 打印异常堆栈
                }
            }
        }, "t1"); // 线程t1的名称
        t1.start(); // 启动线程t1

        Thread.sleep(1000L); // 主线程休眠1秒
        synchronized(lock){ // 同步块，使用lock对象作为锁
            System.out.println(Thread.currentThread().getName() + "...running..."); // 输出主线程运行信息
        }
    }

    private static void sleeping() throws InterruptedException{ // 方法用于演示sleep方法
        Thread t1 = new Thread(() -> { // 创建线程t1
            synchronized(lock){ // 同步块，使用lock对象作为锁
                try {
                    System.out.println(Thread.currentThread().getName() + "...waiting..."); // 输出线程等待信息
                    Thread.sleep(5000L); // 线程休眠5秒
                    System.out.println(Thread.currentThread().getName() + "...running...end..."); // 输出线程结束信息
                } catch (Exception e) { // 捕获异常
                    System.out.println(Thread.currentThread().getName() + "...interrupted..."); // 输出线程中断信息
                    e.printStackTrace(); // 打印异常堆栈
                }
            }
        }, "t1"); // 线程t1的名称
        t1.start(); // 启动线程t1

        Thread.sleep(1000L); // 主线程休眠1秒
        synchronized(lock){ // 同步块，使用lock对象作为锁
            System.out.println(Thread.currentThread().getName() + "...running..."); // 输出主线程运行信息
        }
    }

    public static void main(String[] args) throws InterruptedException{ // 主方法，程序的入口
        sleeping(); // 调用sleeping方法，sleep在同步代码块里面不会释放锁
        waiting(); // 调用waiting方法，wait需要配合同步代码块使用，wait之后会释放锁
    }
}
